let _ = require('lodash');

class Area {
  constructor({ x1, y1, x2, y2, img }, otherInfo) {
    this.x1 = x1;
    this.y1 = y1;
    this.x2 = x2;
    this.y2 = y2;
    this.Width = x2 - x1;
    this.Height = y2 - y1;
    this.img = img || null;
    this.object = otherInfo || {};
  }

  isInViewport(vx1, vy1, vx2, vy2) {
    // vx1, vy1, vx2, vy2 // 为传入视窗的偏移和宽高，与viewport.getXY1XY2 方法值相符

    // 确保矩形的坐标是有效的（x1 < x2 且 y1 < y2）
    if (this.x1 >= this.x2 || this.y1 >= this.y2 || vx1 >= vx2 || vy1 >= vy2) {
      throw new Error('矩形或视口坐标无效');
    }
    // 判断是否重叠
    const isOverlappingX = this.x2 <= vx1 || this.x1 >= vx2; //水平溢出
    const isOverlappingY = this.y2 <= vy1 || this.y1 >= vy2; //垂直溢出
    return !isOverlappingX && !isOverlappingY;
  }
  // 计算矩形在视窗内的相对坐标
  getRelativeCoordinatesInViewport(vx1, vy1, vx2, vy2) {
    // 计算矩形在视窗内的可见部分的左上角和右下角坐标
    const relativeX1 = Math.max(this.x1, vx1); //左可见区
    const relativeY1 = Math.max(this.y1, vy1); //上可见区
    const relativeX2 = Math.min(this.x2, vx2); //右可见区
    const relativeY2 = Math.min(this.y2, vy2); //下可见区

    // 检查是否有重叠
    if (relativeX1 >= relativeX2 || relativeY1 >= relativeY2) {
      // 如果没有重叠，返回一个表示无重叠的标志（这里返回 null，也可以返回其他值）
      return null; // 或者返回 { x1: 0, y1: 0, x2: 0, y2: 0 } 表示无可见部分
    }
    let x1 = relativeX1 - vx1;
    let y1 = relativeY1 - vy1;
    let x2 = relativeX2 - vx1;
    let y2 = relativeY2 - vy1;
    let width = relativeX2 - relativeX1;
    let height = relativeY2 - relativeY1;

    let r = {
      sx: Math.max(vx1 - this.x1, 0), //开始剪切的 x 坐标位置。
      sy: Math.max(vy1 - this.y1, 0), //开始剪切的 y 坐标位置。
      sWidth: width, //被剪切图像的宽度。
      sHeight: height, //被剪切图像的高度。
      x: relativeX1 - vx1, //在画布上放置图像的 x 坐标位置。
      y: relativeY1 - vy1, //在画布上放置图像的 y 坐标位置。
      width: width, //要使用的图像的宽度（伸展或缩小图像）。
      height: height, //要使用的图像的宽度（伸展或缩小图像）。
    }; // 返回相对坐标

    return r;
  }
  isInArea({ x, y }, incEdges) {
    let l_x = Math.min(this.x1, this.x2);
    let r_x = Math.max(this.x1, this.x2);
    let t_y = Math.min(this.y1, this.y2);
    let b_y = Math.max(this.y1, this.y2);
    let bx = l_x < x && x < r_x;
    let ibx = l_x <= x && x <= r_x;
    let by = t_y < y && y < b_y;
    let iby = t_y <= y && y <= b_y;
    return incEdges ? ibx && iby : bx && by;
  }
}

export { Area };
